/*******************************************************************************
 * $Header: /home/cvsroot/develop/workspace/base/com.ease.java/src/com/ease/system/utility/impl/MetainfResources.java,v 1.1 2012/09/26 16:17:28 liwei Exp $
 * $Revision: 1.1 $
 * $Date: 2012/09/26 16:17:28 $
 *
 *==============================================================================
 *
 * Copyright (c) 2001-2006 Primeton Technologies, Ltd.
 * All rights reserved.
 *
 * Created on Nov 6, 2010
 *******************************************************************************/

package com.ease.aa.system.utility.impl;

import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
 * META-INF下相关资源加载.<br>
 * 
 * @author nathanleewei
 */
public class MetainfResources {
	/**
	 * 资源具体的加载动作接口.<br>
	 * 用于
	 * {@link MetainfResources#load(ClassLoader, String, com.primeton.btf.api.core.utils.MetainfResources.ILoadAction)}
	 * 作为回调接口.
	 * 
	 * @author nathanleewei
	 */
	public static interface ILoadAction {

		/**
		 * 具体的加载行为.<br>
		 * 
		 * @param index
		 *            类路径下搜索的资源的顺序.<br>
		 * @param metainfResource
		 *            META-INF的资源
		 * @param metainfUrl
		 *            META-INF的资源的位置
		 * @return 加载结果
		 * @throws Throwable
		 *             加载时的异常
		 */
		Object run(int index, String metainfResource, URL metainfUrl) throws Throwable;
	}

	private static Logger logger = Logger.getLogger(MetainfResources.class.getName());

	/**
	 * 加载指定类路径下的META-INF的资源.<br>
	 * 
	 * @param classLoader
	 *            类路径
	 * @param metainfResource
	 *            META-INF的资源
	 * @param action
	 *            资源具体的加载动作接口
	 * @return 加载结果
	 */
	public static Map<URL, Object> load(ClassLoader classLoader, String metainfResource, ILoadAction action) {
		Map<URL, Object> ret = new LinkedHashMap<URL, Object>();
		Enumeration<URL> metainfUrls = null;
		try {
			metainfUrls = classLoader.getResources(metainfResource);
		} catch (IOException e) {
			throw new RuntimeException("Found meta-inf resource '" + metainfResource + "' in classloader '" + classLoader.toString() + "' error", e);
		}
		if (null != metainfUrls) {
			int index = -1;
			while (metainfUrls.hasMoreElements()) {
				URL metainfUrl = metainfUrls.nextElement();
				try {
					index += 1;
					Object actionRet = action.run(index, metainfResource, metainfUrl);
					ret.put(metainfUrl, actionRet);
				} catch (Throwable e) {
					logger.severe("Load metainf resource '" + metainfUrl.toExternalForm() + "' error. " + (e.getMessage() != null ? e.getMessage() : ""));
				}
			}
		}
		return ret;
	}
}

/*
 * 修改历史 $Log: MetainfResources.java,v $ 修改历史 Revision 1.1 2012/09/26 16:17:28 liwei 修改历史 init 修改历史 修改历史 Revision 1.1
 * 2012/09/09 10:16:53 liwei 修改历史 init 修改历史 修改历史 Revision 1.1 2012/09/09 09:32:25 liwei 修改历史 init 修改历史 修改历史 Revision 1.1
 * 2012/09/07 05:52:00 liwei 修改历史 init 修改历史 修改历史 Revision 1.1 2012/05/30 09:56:29 liwei 修改历史 *** empty log message ***
 * 修改历史 修改历史 Revision 1.3 2012/03/19 17:42:30 liwei 修改历史 init 修改历史 修改历史 Revision 1.2 2012/03/13 20:24:08 liwei 修改历史 init
 * 修改历史 修改历史 Revision 1.1 2012/02/28 07:13:16 liwei 修改历史 init 修改历史 Revision 1.1 2011/08/19 08:37:29 chengy Add:
 * 增加先从类路径的META-INF/resources/ExceptionResource_xxx.properties加载异常的资源文件能力
 * 
 * Revision 1.1 2011/08/08 08:10:26 chengy Add: 从BTP6.1迁移到技术平台
 * 
 * Revision 1.2 2010/12/23 04:35:22 liuxiang update:refactory
 * 
 * Revision 1.1 2010/12/20 03:43:39 wangwb Add:迁移CVS
 * 
 * Revision 1.1 2010/11/29 00:44:22 wangwb Update:迁移CVS
 * 
 * Revision 1.1 2010/11/10 03:12:15 wangwb Add:移动CVS库
 * 
 * Revision 1.1 2010/11/08 05:44:00 wangwb Update:更新异常
 * 
 * Revision 1.1 2010/11/08 00:25:27 wangwb Update:更新
 */